import axios from 'axios';
// 导入axios文件
const request = axios.create({
    baseURL: 'http://toutiao.itheima.net/'
})

// 导入Vuex文件
import { store } from '@/store/index.js';

// 添加请求拦截器
request.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    // 参数config是本次请求的信息
    // 如果有token就添加token
    if (store.state.tokenObj.token) {
        // 在请求发出前，给请求头携带token
        config.headers.Authorization = 'Bearer ' + store.state.tokenObj.token
    }
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 导入router文件
import router from '@/router/index.js';
// 导入toast文件
import { Toast } from 'vant';

// 添加响应拦截器
request.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
}, async function (error) {
    // 判断错误信息是否为token失效的情况
    if (error.response.status === 401) {
        try {
            // 编写代码发起请求，利用refresh_token去请求新的token
            // 如果使用request对象发起请求，就会出发request的请求拦截。触发请求拦截后会把Authorization里的refresh_token给重新赋值覆盖掉，导致服务器报错
            // 所有直接用axios对象发起请求，但是要记得设置完整地址
            let res = await axios({
                url: 'http://toutiao.itheima.net/v1_0/authorizations',
                method: 'put',
                headers: {
                    Authorization: 'Bearer ' + store.state.tokenObj.refresh_token
                }
            })
            // 请求到新的token后，把toke保存到vuex和localStoryage中
            // 在这个位置不能直接保存res.data.data，因为这里只有token
            // 如果直接保存就会把refresh_token弄没了，所以需要手动写一个对象，里面包含token和refresh_token
            store.commit('setToken', {
                token: res.data.data.token,
                refresh_token: store.state.tokenObj.refresh_token
            })
            // 在得到新的token后，就编写代码利用新的token
            // 把之前获得token的请求用新的token再请求一次。得到结果后把结果return出去
            // error对象里的config拥有之前请求的所有信息，利用config再发一次请求即可
            let newRes = await request(error.config)
            return newRes
        } catch {
            // 代码进到这里就说明上面的请求有错，进一步说明refresh_token过期了
            // 所以需要弹出提示并挡回登录页
            Toast.fail('登录状态已失效，请重新登陆')
            router.push('/login')
        }
    } else {
        // 对响应错误做点什么
        return Promise.reject(error);
    }
});

export default request